GDK has a lock to mark critical sections inside the backends.
Additionally, code that would re-enter into the GTK main loop was
supposed to hold the lock.
Back in the Good Old Days™ this was guaranteed to kind of work only on
the X11 backend, and would cause a neat explosion on any other GDK
backend.
During GTK+ 3.x we deprecated the API to enter and leave the critical
sections, and now we can remove all the internal uses of the lock, since
external API that uses GTK+ 4.x won't be able to hold the GDK lock.
https://bugzilla.gnome.org/show_bug.cgi?id=793124
GdkDisplay *display = ((GdkEventSource*) source)->display;
gboolean retval;
- gdk_threads_enter ();
-
*timeout = -1;
retval = (_gdk_event_queue_find_first (display) != NULL);
- gdk_threads_leave ();
-
return retval;
}
GdkEventSource *event_source = (GdkEventSource*) source;
gboolean retval;
- gdk_threads_enter ();
-
if (event_source->display->event_pause_count > 0 ||
event_source->event_poll_fd.revents & G_IO_IN)
retval = (_gdk_event_queue_find_first (event_source->display) != NULL);
else
retval = FALSE;
- gdk_threads_leave ();
-
return retval;
}
GdkDisplay *display = ((GdkEventSource*) source)->display;
GdkEvent *event;
- gdk_threads_enter ();
-
event = gdk_display_get_event (display);
if (event)
gdk_event_free (event);
}
- gdk_threads_leave ();
-
return TRUE;
}
* back here again.
*/
- gdk_threads_enter ();
-
event = gdk_display_get_event (source->display);
if (event)
gdk_event_free (event);
}
- gdk_threads_leave ();
-
return TRUE;
}
{
gboolean retval;
- gdk_threads_enter ();
-
/* The prepare stage is the stage before the main loop starts polling
* and dispatching events. The autorelease poll is drained here for
* the preceding main loop iteration or, in case of the first iteration,
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
_gdk_quartz_event_loop_check_pending ());
- gdk_threads_leave ();
-
return retval;
}
{
gboolean retval;
- gdk_threads_enter ();
-
if (_gdk_display->event_pause_count > 0)
retval = _gdk_event_queue_find_first (_gdk_display) != NULL;
else
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
_gdk_quartz_event_loop_check_pending ());
- gdk_threads_leave ();
-
return retval;
}
{
GdkEvent *event;
- gdk_threads_enter ();
-
_gdk_quartz_display_queue_events (_gdk_display);
event = _gdk_event_unqueue (_gdk_display);
gdk_event_free (event);
}
- gdk_threads_leave ();
-
return TRUE;
}
g_list_free_1 (node);
gdk_event_free (event);
- gdk_threads_leave ();
[NSApp sendEvent:nsevent];
- gdk_threads_enter ();
}
_gdk_quartz_event_loop_release_event (nsevent);
GdkDisplay *display = source->display;
GdkEvent *event;
- gdk_threads_enter ();
-
event = gdk_display_get_event (display);
if (event)
g_object_unref (event);
}
- gdk_threads_leave ();
-
return TRUE;
}
GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
gboolean retval;
- gdk_threads_enter ();
-
*timeout = -1;
if (event_source->display->event_pause_count > 0)
(modal_win32_dialog == NULL &&
GetQueueStatus (QS_ALLINPUT) != 0));
- gdk_threads_leave ();
-
return retval;
}
GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
gboolean retval;
- gdk_threads_enter ();
-
if (event_source->display->event_pause_count > 0)
retval = _gdk_event_queue_find_first (event_source->display) != NULL;
else if (event_source->event_poll_fd.revents & G_IO_IN)
else
retval = FALSE;
- gdk_threads_leave ();
-
return retval;
}
GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
GdkEvent *event;
- gdk_threads_enter ();
-
_gdk_win32_display_queue_events (event_source->display);
event = _gdk_event_unqueue (event_source->display);
}
}
- gdk_threads_leave ();
-
return TRUE;
}
{
GdkInternalConnection *connection = (GdkInternalConnection *)data;
- gdk_threads_enter ();
-
XProcessInternalConnection ((Display*)connection->display, connection->fd);
- gdk_threads_leave ();
-
return TRUE;
}
GdkDisplay *display = ((GdkEventSource*) source)->display;
gboolean retval;
- gdk_threads_enter ();
-
*timeout = -1;
if (display->event_pause_count > 0)
retval = (_gdk_event_queue_find_first (display) != NULL ||
gdk_check_xpending (display));
- gdk_threads_leave ();
-
return retval;
}
GdkEventSource *event_source = (GdkEventSource*) source;
gboolean retval;
- gdk_threads_enter ();
-
if (event_source->display->event_pause_count > 0)
retval = _gdk_event_queue_find_first (event_source->display) != NULL;
else if (event_source->event_poll_fd.revents & G_IO_IN)
else
retval = FALSE;
- gdk_threads_leave ();
-
return retval;
}
GdkDisplay *display = ((GdkEventSource*) source)->display;
GdkEvent *event;
- gdk_threads_enter ();
-
event = gdk_display_get_event (display);
if (event)
g_object_unref (event);
}
- gdk_threads_leave ();
-
return TRUE;
}
{
GtkApplication *application = GTK_APPLICATION (g_application);
- gdk_threads_enter ();
-
gtk_application_impl_before_emit (application->priv->impl, platform_data);
}
gtk_application_after_emit (GApplication *application,
GVariant *platform_data)
{
- gdk_threads_leave ();
}
static void
case G_FILE_MONITOR_EVENT_DELETED:
g_slist_free_full (manager->bookmarks, _gtk_bookmark_free);
manager->bookmarks = read_bookmarks (file);
-
- gdk_threads_enter ();
notify_changed (manager);
- gdk_threads_leave ();
break;
case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
&ri);
ri.loop = g_main_loop_new (NULL, FALSE);
-
- gdk_threads_leave ();
g_main_loop_run (ri.loop);
- gdk_threads_enter ();
-
g_main_loop_unref (ri.loop);
ri.loop = NULL;
if (queried == NULL)
return;
- gdk_threads_enter ();
-
/* now we know model is valid */
/* file was deleted */
if (!_gtk_file_system_model_get_iter_for_file (model, &iter, file))
{
g_object_unref (queried);
- gdk_threads_leave ();
return;
}
g_object_unref (info);
g_object_unref (queried);
-
- gdk_threads_leave ();
}
static gboolean
gpointer volume,
gpointer user_data)
{
- GtkFileSystem *file_system;
-
- gdk_threads_enter ();
+ GtkFileSystem *file_system = user_data;
- file_system = GTK_FILE_SYSTEM (user_data);
g_signal_emit (file_system, fs_signals[VOLUMES_CHANGED], 0, volume);
- gdk_threads_leave ();
}
static void
if (async_data->callback)
{
- gdk_threads_enter ();
((GtkFileSystemGetInfoCallback) async_data->callback) (async_data->cancellable,
file_info, error, async_data->data);
- gdk_threads_leave ();
}
if (file_info)
g_drive_poll_for_media_finish (G_DRIVE (source_object), result, &error);
async_data = (AsyncFuncData *) user_data;
- gdk_threads_enter ();
((GtkFileSystemVolumeMountCallback) async_data->callback) (async_data->cancellable,
(GtkFileSystemVolume *) source_object,
error, async_data->data);
- gdk_threads_leave ();
if (error)
g_error_free (error);
g_volume_mount_finish (G_VOLUME (source_object), result, &error);
async_data = (AsyncFuncData *) user_data;
- gdk_threads_enter ();
((GtkFileSystemVolumeMountCallback) async_data->callback) (async_data->cancellable,
(GtkFileSystemVolume *) source_object,
error, async_data->data);
- gdk_threads_leave ();
if (error)
g_error_free (error);
if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_ALREADY_MOUNTED))
g_clear_error (&error);
- gdk_threads_enter ();
((GtkFileSystemVolumeMountCallback) async_data->callback) (async_data->cancellable, volume,
error, async_data->data);
- gdk_threads_leave ();
if (error)
g_error_free (error);
GList *walk, *files;
GError *error = NULL;
- gdk_threads_enter ();
-
files = g_file_enumerator_next_files_finish (enumerator, res, &error);
if (files)
if (error)
g_error_free (error);
}
-
- gdk_threads_leave ();
}
static void
if (info == NULL)
return;
- gdk_threads_enter ();
-
_gtk_file_system_model_update_file (model, file, info);
id = node_get_for_file (model, file);
gtk_file_system_model_sort_node (model, id);
g_object_unref (info);
-
- gdk_threads_leave ();
}
static void
model);
break;
case G_FILE_MONITOR_EVENT_DELETED:
- gdk_threads_enter ();
remove_file (model, file);
- gdk_threads_leave ();
break;
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
/* FIXME: use freeze/thaw with this somehow? */
GFileEnumerator *enumerator;
GError *error = NULL;
- gdk_threads_enter ();
-
enumerator = g_file_enumerate_children_finish (G_FILE (dir), res, &error);
if (enumerator == NULL)
{
G_CALLBACK (gtk_file_system_model_monitor_change),
model);
}
-
- gdk_threads_leave ();
}
static void
main_loops = g_slist_prepend (main_loops, loop);
if (g_main_loop_is_running (main_loops->data))
- {
- gdk_threads_leave ();
- g_main_loop_run (loop);
- gdk_threads_enter ();
- }
+ g_main_loop_run (loop);
main_loops = g_slist_remove (main_loops, loop);
g_source_set_name_by_id (store_timeout, "[gtk+] gtk_main_sync clipboard store timeout");
if (g_main_loop_is_running (store.store_loop))
- {
- gdk_threads_leave ();
- g_main_loop_run (store.store_loop);
- gdk_threads_enter ();
- }
+ g_main_loop_run (store.store_loop);
g_cancellable_cancel (cancel);
g_object_unref (cancel);
gboolean
gtk_events_pending (void)
{
- gboolean result;
-
- gdk_threads_leave ();
- result = g_main_context_pending (NULL);
- gdk_threads_enter ();
-
- return result;
+ return g_main_context_pending (NULL);
}
/**
gboolean
gtk_main_iteration (void)
{
- gdk_threads_leave ();
g_main_context_iteration (NULL, TRUE);
- gdk_threads_enter ();
if (main_loops)
return !g_main_loop_is_running (main_loops->data);
gboolean
gtk_main_iteration_do (gboolean blocking)
{
- gdk_threads_leave ();
g_main_context_iteration (NULL, blocking);
- gdk_threads_enter ();
if (main_loops)
return !g_main_loop_is_running (main_loops->data);
gtk_native_dialog_show (self);
- gdk_threads_leave ();
g_main_loop_run (priv->run_loop);
- gdk_threads_enter ();
g_signal_handler_disconnect (self, response_handler);
if (wait && printer_list->backends)
{
printer_list->loop = g_main_loop_new (NULL, FALSE);
-
- gdk_threads_leave ();
g_main_loop_run (printer_list->loop);
- gdk_threads_enter ();
}
}
{
g_object_ref (op);
if (!op_portal->file_written)
- {
- gdk_threads_leave ();
- g_main_loop_run (op_portal->loop);
- gdk_threads_enter ();
- }
+ g_main_loop_run (op_portal->loop);
g_object_unref (op);
}
}
call_prepare_print (op, portal);
- gdk_threads_leave ();
g_main_loop_run (portal->loop);
- gdk_threads_enter ();
*do_print = portal->do_print;
result = portal->result;
{
g_object_ref (op);
if (!op_unix->data_sent)
- {
- gdk_threads_leave ();
- g_main_loop_run (op_unix->loop);
- gdk_threads_enter ();
- }
+ g_main_loop_run (op_unix->loop);
g_main_loop_unref (op_unix->loop);
op_unix->loop = NULL;
g_object_unref (op);
find_printer (printer_name,
(GFunc) found_printer, &rdata);
- gdk_threads_leave ();
g_main_loop_run (rdata.loop);
- gdk_threads_enter ();
-
g_main_loop_unref (rdata.loop);
rdata.loop = NULL;
}
priv->rloop = g_main_loop_new (NULL, FALSE);
g_object_ref (op);
- gdk_threads_leave ();
+
g_main_loop_run (priv->rloop);
- gdk_threads_enter ();
-
g_main_loop_unref (priv->rloop);
priv->rloop = NULL;
+
g_object_unref (op);
}
}
case G_FILE_MONITOR_EVENT_CHANGED:
case G_FILE_MONITOR_EVENT_CREATED:
case G_FILE_MONITOR_EVENT_DELETED:
- gdk_threads_enter ();
gtk_recent_manager_changed (manager);
- gdk_threads_leave ();
break;
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
recent_data.groups = NULL;
recent_data.is_private = FALSE;
- gdk_threads_enter ();
-
/* Ignore return value, this can't fail anyway since all required
* fields are set
*/
manager->priv->is_dirty = TRUE;
gtk_recent_manager_changed (manager);
- gdk_threads_leave ();
-
g_free (recent_data.mime_type);
g_free (recent_data.app_name);
g_free (recent_data.app_exec);
GdkRectangle visible_rect;
GdkSeat *seat;
- gdk_threads_enter ();
-
tree_view = GTK_TREE_VIEW (data);
seat = gdk_display_get_default_seat (gtk_widget_get_display (GTK_WIDGET (tree_view)));
}
}
- gdk_threads_leave ();
-
return TRUE;
}
#endif /* 0 */
{
GtkImContextMultipress *multipress_context;
- gdk_threads_enter ();
-
multipress_context = GTK_IM_CONTEXT_MULTIPRESS (data);
/* A certain amount of time has passed, so we will assume that the user
multipress_context->timeout_id = 0;
- gdk_threads_leave ();
-
return G_SOURCE_REMOVE; /* don't call me again */
}
GError *error = NULL;
CupsPrintStreamData *ps = user_data;
- gdk_threads_enter ();
-
GTK_NOTE (PRINTING,
g_print ("CUPS Backend: %s\n", G_STRFUNC));
if (error)
g_error_free (error);
-
- gdk_threads_leave ();
}
typedef struct {
int state;
gboolean done;
- gdk_threads_enter ();
-
if (data->job == NULL)
{
cups_job_poll_data_free (data);
- goto done;
+ return;
}
data->counter++;
}
else
cups_job_poll_data_free (data);
-
-done:
- gdk_threads_leave ();
}
static void
gboolean status_changed = FALSE;
ipp_t *response;
- gdk_threads_enter ();
-
GTK_NOTE (PRINTING,
g_print ("CUPS Backend: %s\n", G_STRFUNC));
}
printer_setup_info_free (info);
-
- gdk_threads_leave ();
}
static void
gchar *remote_default_printer = NULL;
GList *iter;
- gdk_threads_enter ();
-
list_has_changed = FALSE;
GTK_NOTE (PRINTING,
set_default_printer (cups_backend, cups_backend->avahi_default_printer);
}
#endif
-
- gdk_threads_leave ();
}
static void
GtkPrinter *printer;
struct stat data_info;
- gdk_threads_enter ();
-
GTK_NOTE (PRINTING,
g_print ("CUPS Backend: %s\n", G_STRFUNC));
g_signal_emit_by_name (printer, "details-acquired", success);
- goto done;
+ return;
}
#endif
GTK_PRINTER_CUPS (printer)->port,
GTK_PRINT_BACKEND_CUPS (gtk_printer_get_backend (printer)));
- goto done;
+ return;
}
#endif
gtk_printer_set_has_details (printer, TRUE);
g_signal_emit_by_name (printer, "details-acquired", TRUE);
-
-done:
- gdk_threads_leave ();
}
static gboolean
ipp_attribute_t *attr;
GtkPrinter *printer;
- gdk_threads_enter ();
-
if (gtk_cups_result_is_error (result))
{
if (gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_AUTH &&
*/
if (print_backend->list_printers_poll != 0)
cups_request_printer_list (print_backend);
-
- gdk_threads_leave ();
}
static gboolean
GDestroyNotify dnotify;
} _PrintStreamData;
-/* expects GDK lock to be held */
static void
-file_print_cb_locked (GtkPrintBackendFile *print_backend,
- GError *error,
- gpointer user_data)
+file_print_cb (GtkPrintBackendFile *print_backend,
+ GError *error,
+ gpointer user_data)
{
gchar *uri;
ps->dnotify (ps->user_data);
gtk_print_job_set_status (ps->job,
- (error != NULL)?GTK_PRINT_STATUS_FINISHED_ABORTED:GTK_PRINT_STATUS_FINISHED);
+ (error != NULL)
+ ? GTK_PRINT_STATUS_FINISHED_ABORTED
+ : GTK_PRINT_STATUS_FINISHED);
recent_manager = gtk_recent_manager_get_default ();
uri = output_file_from_settings (gtk_print_job_get_settings (ps->job), NULL);
g_free (ps);
}
-static void
-file_print_cb (GtkPrintBackendFile *print_backend,
- GError *error,
- gpointer user_data)
-{
- gdk_threads_enter ();
-
- file_print_cb_locked (print_backend, error, user_data);
-
- gdk_threads_leave ();
-}
-
static gboolean
file_write (GIOChannel *source,
GIOCondition con,
error:
if (internal_error != NULL)
{
- file_print_cb_locked (GTK_PRINT_BACKEND_FILE (print_backend),
- internal_error, ps);
+ file_print_cb (GTK_PRINT_BACKEND_FILE (print_backend),
+ internal_error, ps);
g_error_free (internal_error);
return;